#pragma once
#include <iostream>
#include <fstream>
#include <utility>
#include <vector>
#include <memory>

class Vertex;

struct e { // ребро <указатель на конец ребра, вес, цвет> - вместо tuple
	std::shared_ptr<Vertex> next;
	int weight = 0;
	bool color = false;
};

class Vertex{
public:
	void set_id(int n){
		id = n;
	}

	void add_edge(std::shared_ptr<Vertex> v, int weight, bool color = false){ // добавление ребра
		e edge;
		edge.next = v;
		edge.weight = weight;
		edge.color = color;
		edges.push_back(edge);
	}

	void remove_edge(int edge_end){ // удаление ребра
		std::vector<e>::iterator it = edges.begin();
		while ((it != edges.end()) && ((*(it->next)).id != edge_end))
			it++;
		if (it != edges.end())
			edges.erase(it);
		else
			printf("Attempted to erase unexisting edge. Strange. There must be some bug.");
	}

	std::vector<std::pair<int, int>> invert(){ // разворот рёбер (удаляется текущее, добавляется обратное)
		unsigned int i = 0;
		std::vector<std::pair<int, int>> task;
		while (i < edges.size()){
			if (edges[i].color == false){
				task.push_back(std::make_pair((*(edges[i].next)).id, edges[i].weight));
				remove_edge((*(edges[i].next)).id);
			}
			else
				i++;
		}
		return task;
	}

	void restore_edges_color(){ // все рёбра становятся "необработанными"
		for (unsigned int i = 0; i < edges.size(); i++)
			edges[i].color = false;
	}
	void restore(){ // удаление всех рёбер
		edges.clear();
	}

	std::vector<e> get_edges(){
		return edges;
	}
	int get_id(){
		return id;
	}
	
private:
	int id;
	int Data;
	std::vector<e> edges;
};